<webpack>搭建环境以及相关优化
webpack watch mode
- 使用方式
1 | webpack -watch |
- 不会建立web服务器
webpack-dev-server
- live reloading (重新刷新浏览器)
- 路径重定向
- https
- 在浏览器显示编译错误
- 接口代理
- 模块热更新(不刷新浏览器更新代码)https://www.webpackjs.com/guides/hot-module-replacement/
- 基本配置 https://www.webpackjs.com/configuration/dev-server/
express + webpack-dev-middleware
开启source-map
js开启source-map
- Devtool
- 开发环境使用 cheap-module-source-map\source-map
- 生产环境使用 一般不用,如果修改问题可以配置为source-map
- 生产环境uglify压缩时需要开启配置
- webpack.SourceMapDevToolPlugin
- webpack.EvalSourceMapDevToolPlugin
css开启source-map
- 开启相关loader的sourcemap配置
开发环境和生产环境的区别
开发环境
- 模块热更新
- sourceMap
- 接口代理
- 代码规范检查
生产环境
- 提取公共代码
- 压缩混淆
- 文件压缩或base64编码
- 去除无用代码 tree-shaking
- 分离css
- 打包代码配置
打包结果分析
- 官方 Offical Analyse Tool
- 命令
1 | webpack --profile --json >stats.json |
- webpack-bundle-analyzer
抵用插件BundleAnalyzerPlugin https://www.npmjs.com/package/webpack-bundle-analyzer
命令行
1 | webpack-bundle-analyzer stats.json |
优化打包速度
- 分开vendor与app(第三方与开发文件)使用Dllplugin与DllReferencePlugin
- UglifyJsPlugin 配置参数 parallel:true(并行处理压缩)
- UglifyJsPlugin cache缓存
- HappyPach 并行处理 loader
- babel-loader 配置 cacheDirectory开启缓存、配置include exlude规定范围
- 其他
- 减少 resolve
- 去除 source-map
- cache-loader
- 升级 node\webpack
长缓存优化
场景1:app改变vendor也改变了
- 提取vendor
- 解决hash变化问题:hash->chunkhash(将打包的hash变为代码快的hash),将output[hash]改为[chunkhash]
- 提取 manifest 文件(提取webpack runtime 代码)
场景2:引入新的模块,模块顺序发生变化,vendor hash变化了(因为chunkId变了)
- NameChunksPlugin 改变chunk名
- 保持moduleId稳定 NameModulesPlugin (如果想看打包module name命令行添加 –display-modules)
- 或者使用HashedModuleIdsPlugin 保持moduleId稳定
- vue配置
1 | // 保持chunkId不变 |
场景3:动态引入时vendor hash发生变化(异步加载的包改变)
- 在动态引入的代码中添加 异步module名称
1 | import(/* webpackChunkName: "print" */ './print') |
总结优化打包
- 独立打包vendor
- 抽出manifest
- NameChunksPlugin\NameModulesPlugin\HashedModuleIdsPlugin
- 动态加载模块设置名称